package com.ocom.minio.controller;

import com.ocom.common.resp.Result;
import com.ocom.common.utils.DateUtil;
import com.ocom.common.utils.ResultUtil;
import com.ocom.minio.common.config.FileProperties;
import com.ocom.minio.pojo.FileUploadResult;
import com.ocom.minio.util.FileUtil;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;


@RestController
public class MinioController {


    @Value("${reurl}")
    private String reUrl;


    @Autowired
    private FileUtil fileUtil;


    @Autowired
    private FileProperties fileProperties;

    @Autowired
    private MinioClient minioClient;

    @PostMapping("/upload/file")
    public Result upload(@RequestPart("file") MultipartFile file) throws Exception{
        if (file.getSize() > 0) {
            //创建一个MinIO的Java客户端
            MinioClient minioClient = new MinioClient(fileProperties.getEndpoint(), fileProperties.getAuthPort(),"admin", "admin123456");
            String bucketName = fileProperties.getBucketName();
            boolean isExist = minioClient.bucketExists(bucketName);
            if (!isExist) {
                minioClient.makeBucket(bucketName);
            }
            // 原文件名
            String fileName = file.getOriginalFilename();
            // 文件类型
            String suffixName = fileName.substring(fileName.lastIndexOf("."));
            // 生成新文件名，确保唯一性
            String objectName = UUID.randomUUID().toString() + suffixName;
            // 文件类型
            String fileType = file.getContentType();
            // 使用putObject上传一个文件到存储桶中

			String ymd = DateUtil.getDate();
			String[] ymh= ymd.split("-");

			objectName=ymh[0] + "/" +ymh[1] +"/" +ymh[2] +"/" + objectName;

            minioClient.putObject(bucketName, objectName, file.getInputStream(), fileType);
            // 得到文件 url
            String imageUrl = minioClient.getObjectUrl(bucketName, objectName);

            imageUrl= reUrl+bucketName+"/"+objectName;
            return ResultUtil.success(new FileUploadResult(fileName, file.getSize(), fileType, objectName, imageUrl));
        }
        return ResultUtil.info(400,"未选择任何文件，上传失败");
    }

//    // 正则表达式，然后结果存在filename 这个变量里
//    // 比如 /downloadFile/123q, 那么 fileName 就是 123q
//    @GetMapping("/springcloud/{fileName:.+}")
//    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName,@RequestParam(required = false,defaultValue = "512") Integer size, HttpServletRequest request) throws Exception{
//        // Load file as Resource
// //       Resource resource = new UrlResource("http://47.113.206.142:9000/testone/" + fileName);
// //       String url = fileProperties.getServerPath() + "/" + fileProperties.getBucketName() + "/" + fileName;
//        String url = fileProperties.getEndpoint()+":9002/springcloud/" + fileName;
//
//        Resource resource = fileUtil.loadUrlAsResource(url);
//
//        // 判断文件类型
//        Boolean b = ImageUtil.isPicture(fileName);
//
//        Resource resource1 =null;
//
//        File file = new File(path+fileName);
//
//        URL url2=new URL( url);
//        //根据响应获取文件大小
//        HttpURLConnection urlcon=(HttpURLConnection)url2.openConnection();
//        //获取相应的文件长度
//        Integer fileLength=urlcon.getContentLength();
//
//        System.out.println(fileLength);
//
//        //是图片  压缩
//        try{
//            if(b && size>0){
//                Boolean aBoolean  = ImageUtil.downloadFile(url,path);
//                //下载成功
//                if (aBoolean) {
//                    System.out.println(file);
//
//
//                    // 生成临时文件
//                    File zipFile = File.createTempFile(UUID.randomUUID().toString(), file.getName());
//                    // 压缩文件
//                    ImageUtil.compressUnderSize(file, size * 1024, zipFile);
//                    // 默认地址:C:\Users\Administrator\AppData\Local\Temp
//                    System.out.println(zipFile.getAbsolutePath());
//                    resource1 = new PathResource(zipFile.getPath());
//                }
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//        }finally {
////            file.delete();
//        }
//
//        System.out.println(b);
//
//        // Try to determine file's content type
//        String contentType = null;
//        try {
//            contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
//        } catch (IOException ex) {
//        }
//
//        if(contentType == null) {
//            contentType = "application/octet-stream";
//        }
//        if(resource1==null){
//            resource1= resource;
//        }
//        return ResponseEntity.ok()
//                .contentType(MediaType.parseMediaType(contentType))
//                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
//                .body(resource1);
//    }
}
